package com.xyd.auth.contoller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xyd.auth.service.ISysMenuService;
import com.xyd.auth.service.ISysUserService;
import com.xyd.common.exception.YiYunGlobalException;
import com.xyd.common.result.GlobalResultClass;
import com.xyd.common.util.JwtHelper;
import com.xyd.common.util.MD5;
import com.xyd.model.system.SysUser;
import com.xyd.model.system.vo.LoginVO;
import com.xyd.model.system.vo.RouterVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.List;

@Tag(name="后台登录管理")
@RestController
@RequestMapping("/admin/system/index")
public class IndexController {

    @Autowired
    ISysUserService sysUserService;

    /**
     * 登录
     * @return
     */
    @Operation(description = "用户登录")
    @PostMapping("/login")
    public GlobalResultClass login(@RequestBody LoginVO longInVO){
        // 1.获取用户输入的账号密码
        String username = longInVO.getUsername();
        String password = longInVO.getPassword(); // 用户输入的
        // 2.根据用户名查询一个用户
        // 2.1 设定条件
        LambdaQueryWrapper<SysUser> wrapper =
                new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username);
        // 2.2 调用service查询用户
        SysUser oneUser = sysUserService.getOne(wrapper);
        // 3.判断用户名是否存在
        if(oneUser == null){
            throw new YiYunGlobalException(4001,"用户名不存在");
        }
        // 4.获取查询出来的用户密码
        String passwordQuery = oneUser.getPassword(); // 数据库中保存的密码
        // 5.将用户输入的密码进行加密再判断
        String passwordInput = MD5.encrypt(password);
        if(!passwordInput.equals(passwordQuery)){
            throw new YiYunGlobalException(4001,"密码错误");
        }
        // 6.判断是否禁用
        if(oneUser.getStatus() == 0){
            throw new YiYunGlobalException(4001,"该账号被禁用");
        }
        // 7.生成token(令牌)
        System.out.println("用户的id"+oneUser.getId());
        String token = JwtHelper.createToken(oneUser.getId(), oneUser.getUsername());
        System.out.println("登录："+token);
        Map<String, String> map = new HashMap<>();
        map.put("token",token);
        return GlobalResultClass.ok(map);
    }

    @Autowired
    ISysMenuService sysMenuService;
    /**
     * 获取用户信息
     * @return
     */
    @GetMapping("/info")
    public GlobalResultClass info(HttpServletRequest request){ // request对象中获取token
       // 1.获取token，token中有用户信息
        String token = request.getHeader("token");
        // 2.通过token获取userId和username
        Long userId = JwtHelper.getUserId(token);
        System.out.println("用户信息："+userId);
        String username = JwtHelper.getUsername(token);
        // 3 根据用户ID查询数据库 把对应的用户查询出来
        SysUser user = sysUserService.getById(userId);
        // 4 根据用户ID获取用户可以操作的菜单列表（前端的路由不能写死啦）
        // 用户角色关系表 角色菜单关系表 菜单表
        List<RouterVO> routerVOList =  sysMenuService.findSysMenuByUserId(userId);
        // 5 根据用户ID获取用户可以操作的按钮权限列表perms（按钮权限）是permissions的简写
        List<String> permsList = sysMenuService.findSysUserPermsByUserId(userId);

        Map<String,Object> map = new HashMap<>();
        // 权限
        map.put("roles","[amdin]");
        // 用户名
        map.put("name",user.getName());
        // 头像
        map.put("avatar",user.getHeadUrl());
        map.put("buttons",permsList); // 按钮权限
        map.put("routers",routerVOList); // 菜单权限
        return GlobalResultClass.ok(map);
    }

    /**
     * 退出登录
     * @return
     */
    @PostMapping("/logout")
    public GlobalResultClass logout(){
        return GlobalResultClass.ok();
    }

}
